package day16;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ArrayListTest {
    @Test
    public void test(){
        List<String> stringList = new ArrayList<>();
        //增加
        stringList.add("000");
        stringList.add("111");
        stringList.add("222");
        stringList.add("222");
        stringList.add("222");
        stringList.add("333");
        //删除
        stringList.remove(3);
        //修改
        stringList.set(0,"000000");
        //查询
        stringList.get(1);

        //遍历
        for (int i=0;i<stringList.size();i++){
            System.out.print(stringList.get(i)+" ");
        }
        System.out.println();
        for (String str:stringList){
            System.out.print(str+" ");
        }
        System.out.println();
        removeList(stringList,"222");
        Iterator<String> stringIterator = stringList.iterator();
        while (stringIterator.hasNext()){
            System.out.print(stringIterator.next()+" ");
        }

    }
    //删除全部相关值
    public void removeList(List<String> stringList,String value){
        Iterator<String> iterator = stringList.iterator();
        while (iterator.hasNext()){
            if (iterator.next().equals(value)){
                iterator.remove();
            }
        }
    }

    //1、ArrayList的扩容机制
    //1.第一次add时，把底层数组扩容为10.
    //2.若容量不够，add()/addAll()  把数组扩容为 原来的1.5倍与所需最小容量取最大值

    //2、HashMap的底层数据结构
    //JDK1.8以前，底层数据结构为数组加单向链表
    //JDK1.8以后，底层数据结构为数组加单向链表加红黑树

    //3、HashMap存放元素
    //HashMap里以键值对的方式存储元素
    //HashMap底层默认有一个容量为16的数组，加载因子是0.75，数组里存放16个链表，链表里的每个结点存放entry,entry存放键值对，也就是key和value;
    //链表又以红黑树的形式存在
    //当数组容量不够时，容量扩容为原来的2倍，然后将元素均匀分布

    //4、HashMap与HashSet的异同
    //相同处:
    //都是无序，不可重复的(HashMap中键相同值不同，则会把原来的值覆盖)
    //都实现了Cloneable接口与Serializable接口
    //HashSet的底层是HashMap
    //都有hash碰撞问题
    //都能通过增强型for循环和迭代器进行遍历


    //区别:       HashMap                                 HashSet
    //      HashMap实现了Map接口                         HashSet实现了Set接口
    //      HashMap存放键值对                             HashSet存放对象
    //      使用put()方法添加和修改，以get()方法查询          使用add()方法添加，无修改方法，需自己添加，以contains()查询
    //      使用键对象计算hashcode值                       使用成员对象计算hashcode值，对于相同的对象通过equals方法判断对象是否相等
    //      比较快，因为使用唯一的键值来获取对象               比HashMap慢

}
